package cn.kgc.tangcco.lamda;

import cn.kgc.tangcco.dto.Emp;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.*;

/**
 * @author 李昊哲
 * @Description lamda表达式
 * @create 2020/9/2 上午9:05
 */
public class PreFunctionalInterface {
    @Test
    public void test01() {
        // 没有参数有返回值
        Supplier<String> supplier = () -> {
            return "李昊哲很帅";
        };
        String text = supplier.get();
        System.out.println(text);
    }

    @Test
    public void test02() {
        // 一个参数有返回值
        UnaryOperator<Integer> unaryOperator = (n) -> {
            return 2 * n + 1;
        };
        Integer apply = unaryOperator.apply(10);
        System.out.println(apply);
    }

    @Test
    public void test03() {
        // 两个参数有返回值
        BinaryOperator<Integer> binaryOperator = (a, b) -> {
            return a + b;
        };
        Integer apply = binaryOperator.apply(10, 20);
        System.out.println(apply);
    }

    @Test
    public void test04() {
        // 一个参数没有返回值
        Consumer<String> consumer = (nickname) -> {
            System.out.println(nickname + "很帅");
        };
        consumer.accept("李昊哲");
    }

    @Test
    public void test05() {
        List<Emp> list = new ArrayList<>() {{
            // 模拟数据库中数据
            for (int i = 0; i < 10; i++) {
                add(new Emp("emp" + 0, "123456", "user" + i));
            }
        }};

        Function<Emp, Emp> function = (emp) -> {
            // 遍历数据库判断传人的参数在数据库中是否存在
            Iterator<Emp> it = list.listIterator();
            while (it.hasNext()) {
                Emp next = it.next();
                if (next.getAccout().equals(emp.getAccout()) && next.getPassword().equals(emp.getPassword())) {
                    // 如果传入是参数在数据库中存在则返回相关信息
                    return next;
                }
            }
            // 如果传入是参数在数据库中存在则返回null
            return null;
        };
        // 模拟传人数据中查询到参数
        Emp emp = new Emp("emp0", "123456");
        // 调用lamda查询数据库
        emp = function.apply(emp);
        if (emp != null) {
            // 如果返回值不是null则说明该参数在数据库中存在获取我们需要的数据
            System.out.println("欢迎" + emp.getNickname() + "！！！");
        } else {
            // 如果返回值是null则说明该参数在数据库中不存存在 做出友好提示信息
            System.out.println("账号或者密码错误");
        }
    }

    @Test
    public void test06() {
        // 断言
        boolean isOK = true;
        if (isOK) {
            System.out.println("程序正常");
        } else {
            System.out.println("程序异常");
        }
    }

    @Test
    public void test07() {

        boolean isOK = true;
        try {
            // 断言
            assert isOK == false;
            System.out.println("程序正常");
        } catch (AssertionError error) {
            System.out.println("程序异常");
        }
    }

    @Test
    public void test08() {

        int price = 1000 * 3;
        try {
            // 断言
            assert price == 1000 * 3;
            System.out.println("预测楼市成功");
        } catch (AssertionError error) {
            System.out.println("预测楼市失败");
        }
    }

    @Test
    public void test09() {

        List<Emp> list = new ArrayList<>() {{
            // 模拟数据库中数据
            for (int i = 0; i < 10; i++) {
                add(new Emp("emp" + 0, "123456", "user" + i));
            }
        }};
        // 返回布尔值 方法为test
        Predicate<Emp> function = (emp) -> {
            // 遍历数据库判断传人的参数在数据库中是否存在
            Iterator<Emp> it = list.listIterator();
            while (it.hasNext()) {
                Emp next = it.next();
                if (next.getAccout().equals(emp.getAccout()) && next.getPassword().equals(emp.getPassword())) {
                    // 如果传入是参数在数据库中存在则返回true
                    return true;
                }
            }
            // 如果传入是参数在数据库中存在则返回false
            return false;
        };
        // 模拟传人数据中查询到参数
        Emp emp = new Emp("emp0", "123456");
        // 调用lamda查询数据库
        Boolean isOK = function.test(emp);
        if (isOK) {
            System.out.println("登录成功");
        } else {
            System.out.println("账号或者密码错误");
        }
    }

}
